<?php

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Gdata
 * @subpackage Books
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: VolumeEntry.php 23775 2011-03-01 17:25:24Z ralph $
 */

/**
 * @see Zend_Gdata_Entry
 */
require_once 'Zend/Gdata/Entry.php';

/**
 * @see Zend_Gdata_Extension_Comments
 */
require_once 'Zend/Gdata/Extension/Comments.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Creator
 */
require_once 'Zend/Gdata/DublinCore/Extension/Creator.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Date
 */
require_once 'Zend/Gdata/DublinCore/Extension/Date.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Description
 */
require_once 'Zend/Gdata/DublinCore/Extension/Description.php';

/**
 * @see Zend_Gdata_Books_Extension_Embeddability
 */
require_once 'Zend/Gdata/Books/Extension/Embeddability.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Format
 */
require_once 'Zend/Gdata/DublinCore/Extension/Format.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Identifier
 */
require_once 'Zend/Gdata/DublinCore/Extension/Identifier.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Language
 */
require_once 'Zend/Gdata/DublinCore/Extension/Language.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Publisher
 */
require_once 'Zend/Gdata/DublinCore/Extension/Publisher.php';

/**
 * @see Zend_Gdata_Extension_Rating
 */
require_once 'Zend/Gdata/Extension/Rating.php';

/**
 * @see Zend_Gdata_Books_Extension_Review
 */
require_once 'Zend/Gdata/Books/Extension/Review.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Subject
 */
require_once 'Zend/Gdata/DublinCore/Extension/Subject.php';

/**
 * @see Zend_Gdata_DublinCore_Extension_Title
 */
require_once 'Zend/Gdata/DublinCore/Extension/Title.php';

/**
 * @see Zend_Gdata_Books_Extension_Viewability
 */
require_once 'Zend/Gdata/Books/Extension/Viewability.php';

/**
 * Describes an entry in a feed of Book Search volumes
 *
 * @category   Zend
 * @package    Zend_Gdata
 * @subpackage Books
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Gdata_Books_VolumeEntry extends Zend_Gdata_Entry {
	
	const THUMBNAIL_LINK_REL = 'http://schemas.google.com/books/2008/thumbnail';
	const PREVIEW_LINK_REL = 'http://schemas.google.com/books/2008/preview';
	const INFO_LINK_REL = 'http://schemas.google.com/books/2008/info';
	const ANNOTATION_LINK_REL = 'http://schemas.google.com/books/2008/annotation';
	
	protected $_comments = null;
	protected $_creators = array ();
	protected $_dates = array ();
	protected $_descriptions = array ();
	protected $_embeddability = null;
	protected $_formats = array ();
	protected $_identifiers = array ();
	protected $_languages = array ();
	protected $_publishers = array ();
	protected $_rating = null;
	protected $_review = null;
	protected $_subjects = array ();
	protected $_titles = array ();
	protected $_viewability = null;
	
	/**
	 * Constructor for Zend_Gdata_Books_VolumeEntry which
	 * Describes an entry in a feed of Book Search volumes
	 *
	 * @param DOMElement $element (optional) DOMElement from which this
	 * object should be constructed.
	 */
	public function __construct($element = null) {
		$this->registerAllNamespaces ( Zend_Gdata_Books::$namespaces );
		parent::__construct ( $element );
	}
	
	/**
	 * Retrieves DOMElement which corresponds to this element and all
	 * child properties. This is used to build this object back into a DOM
	 * and eventually XML text for sending to the server upon updates, or
	 * for application storage/persistance.
	 *
	 * @param DOMDocument $doc The DOMDocument used to construct DOMElements
	 * @return DOMElement The DOMElement representing this element and all
	 * child properties.
	 */
	public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) {
		$element = parent::getDOM ( $doc );
		if ($this->_creators !== null) {
			foreach ( $this->_creators as $creators ) {
				$element->appendChild ( $creators->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_dates !== null) {
			foreach ( $this->_dates as $dates ) {
				$element->appendChild ( $dates->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_descriptions !== null) {
			foreach ( $this->_descriptions as $descriptions ) {
				$element->appendChild ( $descriptions->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_formats !== null) {
			foreach ( $this->_formats as $formats ) {
				$element->appendChild ( $formats->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_identifiers !== null) {
			foreach ( $this->_identifiers as $identifiers ) {
				$element->appendChild ( $identifiers->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_languages !== null) {
			foreach ( $this->_languages as $languages ) {
				$element->appendChild ( $languages->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_publishers !== null) {
			foreach ( $this->_publishers as $publishers ) {
				$element->appendChild ( $publishers->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_subjects !== null) {
			foreach ( $this->_subjects as $subjects ) {
				$element->appendChild ( $subjects->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_titles !== null) {
			foreach ( $this->_titles as $titles ) {
				$element->appendChild ( $titles->getDOM ( $element->ownerDocument ) );
			}
		}
		if ($this->_comments !== null) {
			$element->appendChild ( $this->_comments->getDOM ( $element->ownerDocument ) );
		}
		if ($this->_embeddability !== null) {
			$element->appendChild ( $this->_embeddability->getDOM ( $element->ownerDocument ) );
		}
		if ($this->_rating !== null) {
			$element->appendChild ( $this->_rating->getDOM ( $element->ownerDocument ) );
		}
		if ($this->_review !== null) {
			$element->appendChild ( $this->_review->getDOM ( $element->ownerDocument ) );
		}
		if ($this->_viewability !== null) {
			$element->appendChild ( $this->_viewability->getDOM ( $element->ownerDocument ) );
		}
		return $element;
	}
	
	/**
	 * Creates individual objects of the appropriate type and stores
	 * them in this object based upon DOM data.
	 *
	 * @param DOMNode $child The DOMNode to process.
	 */
	protected function takeChildFromDOM($child) {
		$absoluteNodeName = $child->namespaceURI . ':' . $child->localName;
		switch ($absoluteNodeName) {
			case $this->lookupNamespace ( 'dc' ) . ':' . 'creator' :
				$creators = new Zend_Gdata_DublinCore_Extension_Creator ();
				$creators->transferFromDOM ( $child );
				$this->_creators [] = $creators;
				break;
			case $this->lookupNamespace ( 'dc' ) . ':' . 'date' :
				$dates = new Zend_Gdata_DublinCore_Extension_Date ();
				$dates->transferFromDOM ( $child );
				$this->_dates [] = $dates;
				break;
			case $this->lookupNamespace ( 'dc' ) . ':' . 'description' :
				$descriptions = new Zend_Gdata_DublinCore_Extension_Description ();
				$descriptions->transferFromDOM ( $child );
				$this->_descriptions [] = $descriptions;
				break;
			case $this->lookupNamespace ( 'dc' ) . ':' . 'format' :
				$formats = new Zend_Gdata_DublinCore_Extension_Format ();
				$formats->transferFromDOM ( $child );
				$this->_formats [] = $formats;
				break;
			case $this->lookupNamespace ( 'dc' ) . ':' . 'identifier' :
				$identifiers = new Zend_Gdata_DublinCore_Extension_Identifier ();
				$identifiers->transferFromDOM ( $child );
				$this->_identifiers [] = $identifiers;
				break;
			case $this->lookupNamespace ( 'dc' ) . ':' . 'language' :
				$languages = new Zend_Gdata_DublinCore_Extension_Language ();
				$languages->transferFromDOM ( $child );
				$this->_languages [] = $languages;
				break;
			case $this->lookupNamespace ( 'dc' ) . ':' . 'publisher' :
				$publishers = new Zend_Gdata_DublinCore_Extension_Publisher ();
				$publishers->transferFromDOM ( $child );
				$this->_publishers [] = $publishers;
				break;
			case $this->lookupNamespace ( 'dc' ) . ':' . 'subject' :
				$subjects = new Zend_Gdata_DublinCore_Extension_Subject ();
				$subjects->transferFromDOM ( $child );
				$this->_subjects [] = $subjects;
				break;
			case $this->lookupNamespace ( 'dc' ) . ':' . 'title' :
				$titles = new Zend_Gdata_DublinCore_Extension_Title ();
				$titles->transferFromDOM ( $child );
				$this->_titles [] = $titles;
				break;
			case $this->lookupNamespace ( 'gd' ) . ':' . 'comments' :
				$comments = new Zend_Gdata_Extension_Comments ();
				$comments->transferFromDOM ( $child );
				$this->_comments = $comments;
				break;
			case $this->lookupNamespace ( 'gbs' ) . ':' . 'embeddability' :
				$embeddability = new Zend_Gdata_Books_Extension_Embeddability ();
				$embeddability->transferFromDOM ( $child );
				$this->_embeddability = $embeddability;
				break;
			case $this->lookupNamespace ( 'gd' ) . ':' . 'rating' :
				$rating = new Zend_Gdata_Extension_Rating ();
				$rating->transferFromDOM ( $child );
				$this->_rating = $rating;
				break;
			case $this->lookupNamespace ( 'gbs' ) . ':' . 'review' :
				$review = new Zend_Gdata_Books_Extension_Review ();
				$review->transferFromDOM ( $child );
				$this->_review = $review;
				break;
			case $this->lookupNamespace ( 'gbs' ) . ':' . 'viewability' :
				$viewability = new Zend_Gdata_Books_Extension_Viewability ();
				$viewability->transferFromDOM ( $child );
				$this->_viewability = $viewability;
				break;
			default :
				parent::takeChildFromDOM ( $child );
				break;
		}
	}
	
	/**
	 * Returns the Comments class
	 *
	 * @return Zend_Gdata_Extension_Comments|null The comments
	 */
	public function getComments() {
		return $this->_comments;
	}
	
	/**
	 * Returns the creators
	 *
	 * @return array The creators
	 */
	public function getCreators() {
		return $this->_creators;
	}
	
	/**
	 * Returns the dates
	 *
	 * @return array The dates
	 */
	public function getDates() {
		return $this->_dates;
	}
	
	/**
	 * Returns the descriptions
	 *
	 * @return array The descriptions
	 */
	public function getDescriptions() {
		return $this->_descriptions;
	}
	
	/**
	 * Returns the embeddability
	 *
	 * @return Zend_Gdata_Books_Extension_Embeddability|null The embeddability
	 */
	public function getEmbeddability() {
		return $this->_embeddability;
	}
	
	/**
	 * Returns the formats
	 *
	 * @return array The formats
	 */
	public function getFormats() {
		return $this->_formats;
	}
	
	/**
	 * Returns the identifiers
	 *
	 * @return array The identifiers
	 */
	public function getIdentifiers() {
		return $this->_identifiers;
	}
	
	/**
	 * Returns the languages
	 *
	 * @return array The languages
	 */
	public function getLanguages() {
		return $this->_languages;
	}
	
	/**
	 * Returns the publishers
	 *
	 * @return array The publishers
	 */
	public function getPublishers() {
		return $this->_publishers;
	}
	
	/**
	 * Returns the rating
	 *
	 * @return Zend_Gdata_Extension_Rating|null The rating
	 */
	public function getRating() {
		return $this->_rating;
	}
	
	/**
	 * Returns the review
	 *
	 * @return Zend_Gdata_Books_Extension_Review|null The review
	 */
	public function getReview() {
		return $this->_review;
	}
	
	/**
	 * Returns the subjects
	 *
	 * @return array The subjects
	 */
	public function getSubjects() {
		return $this->_subjects;
	}
	
	/**
	 * Returns the titles
	 *
	 * @return array The titles
	 */
	public function getTitles() {
		return $this->_titles;
	}
	
	/**
	 * Returns the viewability
	 *
	 * @return Zend_Gdata_Books_Extension_Viewability|null The viewability
	 */
	public function getViewability() {
		return $this->_viewability;
	}
	
	/**
	 * Sets the Comments class
	 *
	 * @param Zend_Gdata_Extension_Comments|null $comments Comments class
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setComments($comments) {
		$this->_comments = $comments;
		return $this;
	}
	
	/**
	 * Sets the creators
	 *
	 * @param array $creators Creators|null
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setCreators($creators) {
		$this->_creators = $creators;
		return $this;
	}
	
	/**
	 * Sets the dates
	 *
	 * @param array $dates dates
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setDates($dates) {
		$this->_dates = $dates;
		return $this;
	}
	
	/**
	 * Sets the descriptions
	 *
	 * @param array $descriptions descriptions
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setDescriptions($descriptions) {
		$this->_descriptions = $descriptions;
		return $this;
	}
	
	/**
	 * Sets the embeddability
	 *
	 * @param Zend_Gdata_Books_Extension_Embeddability|null $embeddability
	 * embeddability
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setEmbeddability($embeddability) {
		$this->_embeddability = $embeddability;
		return $this;
	}
	
	/**
	 * Sets the formats
	 *
	 * @param array $formats formats
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setFormats($formats) {
		$this->_formats = $formats;
		return $this;
	}
	
	/**
	 * Sets the identifiers
	 *
	 * @param array $identifiers identifiers
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setIdentifiers($identifiers) {
		$this->_identifiers = $identifiers;
		return $this;
	}
	
	/**
	 * Sets the languages
	 *
	 * @param array $languages languages
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setLanguages($languages) {
		$this->_languages = $languages;
		return $this;
	}
	
	/**
	 * Sets the publishers
	 *
	 * @param array $publishers publishers
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setPublishers($publishers) {
		$this->_publishers = $publishers;
		return $this;
	}
	
	/**
	 * Sets the rating
	 *
	 * @param Zend_Gdata_Extension_Rating|null $rating rating
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setRating($rating) {
		$this->_rating = $rating;
		return $this;
	}
	
	/**
	 * Sets the review
	 *
	 * @param Zend_Gdata_Books_Extension_Review|null $review review
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setReview($review) {
		$this->_review = $review;
		return $this;
	}
	
	/**
	 * Sets the subjects
	 *
	 * @param array $subjects subjects
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setSubjects($subjects) {
		$this->_subjects = $subjects;
		return $this;
	}
	
	/**
	 * Sets the titles
	 *
	 * @param array $titles titles
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setTitles($titles) {
		$this->_titles = $titles;
		return $this;
	}
	
	/**
	 * Sets the viewability
	 *
	 * @param Zend_Gdata_Books_Extension_Viewability|null $viewability
	 * viewability
	 * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface
	 */
	public function setViewability($viewability) {
		$this->_viewability = $viewability;
		return $this;
	}
	
	/**
	 * Gets the volume ID based upon the atom:id value
	 *
	 * @return string The volume ID
	 * @throws Zend_Gdata_App_Exception
	 */
	public function getVolumeId() {
		$fullId = $this->getId ()->getText ();
		$position = strrpos ( $fullId, '/' );
		if ($position === false) {
			require_once 'Zend/Gdata/App/Exception.php';
			throw new Zend_Gdata_App_Exception ( 'Slash not found in atom:id' );
		} else {
			return substr ( $fullId, strrpos ( $fullId, '/' ) + 1 );
		}
	}
	
	/**
	 * Gets the thumbnail link
	 *
	 * @return Zend_Gdata_App_Extension_link|null The thumbnail link
	 */
	public function getThumbnailLink() {
		return $this->getLink ( self::THUMBNAIL_LINK_REL );
	}
	
	/**
	 * Gets the preview link
	 *
	 * @return Zend_Gdata_App_Extension_Link|null The preview link
	 */
	public function getPreviewLink() {
		return $this->getLink ( self::PREVIEW_LINK_REL );
	}
	
	/**
	 * Gets the info link
	 *
	 * @return Zend_Gdata_App_Extension_Link|null The info link
	 */
	public function getInfoLink() {
		return $this->getLink ( self::INFO_LINK_REL );
	}
	
	/**
	 * Gets the annotations link
	 *
	 * @return Zend_Gdata_App_Extension_Link|null The annotations link
	 */
	public function getAnnotationLink() {
		return $this->getLink ( self::ANNOTATION_LINK_REL );
	}

}
